don't create fictious course and speed values. (#1031)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Tue, 7 Mar 2023 20:32:44 +0000 (13:32 -0700)
committerGitHub <noreply@github.com>
Tue, 7 Mar 2023 20:32:44 +0000 (13:32 -0700)
We compute coures and speed in track_recompute, which is used
by the kml and gtrnctr writers.  We also compute these in the track
filter with the course speed options.

Both of these algorithums compute the course and speed for a point
based on the time and position of that point and a previous point.
Given that no information from the future is used, the course and
speed of the first point cannot be determined.  This PR introduces
a change so a fictious value for the first point is not generated.

14 files changed:
reference/LineStyles.kml
reference/earth-expertgps-track.kml
reference/earth-expertgps.kml
reference/realtime.kml
reference/track/bounds-test-track.kml
reference/track/gpx_garmin_extensions-kml_track.kml
reference/track/segmented_tracks-track.kml
reference/track/segmented_tracks.kml
reference/track/trackfilter_merge~gpx.gpx
reference/track/trackfilter_trk2seg~gpx.gpx
reference/track/tracks~gpx.kml
reference/track/utm_subsecond_track~csv.csv
route.cc
trackfilter.cc

index 6b1053929cdc83a75424a7f0a47fded3ff875d9a..7ba1f585d856914b6605041023220a65d13f6b2c 100644 (file)
 <table>
 <tr><td>Longitude: -122.292646</td></tr>
 <tr><td>Latitude: 37.524989</td></tr>
-<tr><td>Heading: 312.3</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.292093</td></tr>
 <tr><td>Latitude: 37.520199</td></tr>
-<tr><td>Heading: 312.3</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.291970</td></tr>
 <tr><td>Latitude: 37.515653</td></tr>
-<tr><td>Heading: 312.2</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.291356</td></tr>
 <tr><td>Latitude: 37.510277</td></tr>
-<tr><td>Heading: 312.2</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.292584</td></tr>
 <tr><td>Latitude: 37.528654</td></tr>
-<tr><td>Heading: 312.3</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.292277</td></tr>
 <tr><td>Latitude: 37.530854</td></tr>
-<tr><td>Heading: 312.3</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.292032</td></tr>
 <tr><td>Latitude: 37.533444</td></tr>
-<tr><td>Heading: 312.3</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.291663</td></tr>
 <tr><td>Latitude: 37.535986</td></tr>
-<tr><td>Heading: 312.3</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.291541</td></tr>
 <tr><td>Latitude: 37.538136</td></tr>
-<tr><td>Heading: 312.3</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.291847</td></tr>
 <tr><td>Latitude: 37.517951</td></tr>
-<tr><td>Heading: 312.2</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.291111</td></tr>
 <tr><td>Latitude: 37.513161</td></tr>
-<tr><td>Heading: 312.2</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -122.261028</td></tr>
 <tr><td>Latitude: 37.507931</td></tr>
-<tr><td>Heading: 312.2</td></tr>
 </table>
 ]]></description>
             <LookAt>
index 1cdd3917804b32e5166bee7e3ab44a30786a8941..d19e9993b74e8af439ffab3065eadd792122caa8 100644 (file)
 <tr><td>Longitude: -91.610350</td></tr>
 <tr><td>Latitude: 30.062183</td></tr>
 <tr><td>Altitude: 3.281 ft</td></tr>
-<tr><td>Heading: 300.1</td></tr>
 <tr><td>Time: 2002-05-25T17:06:21Z</td></tr>
 </table>
 ]]></description>
index cd6ef6b1de042654acf514e7ce5e2a9a74496fe8..7ae34cba3599bf8f5a5469ac641511ac60e49ea0 100644 (file)
 <tr><td>Longitude: -91.610350</td></tr>
 <tr><td>Latitude: 30.062183</td></tr>
 <tr><td>Altitude: 3.281 ft</td></tr>
-<tr><td>Heading: 300.1</td></tr>
 <tr><td>Time: 2002-05-25T17:06:21Z</td></tr>
 </table>
 ]]></description>
index 94828e2cf9439ba87dc5453360f3482bd25ead38..1eb65120f1e650f83f2274038c210662d8d9a7ec 100644 (file)
 <tr><td>Cadence: 245</td></tr>
 <tr><td>Heart rate: 25</td></tr>
 <tr><td>Power: 88.9</td></tr>
-<tr><td>Heading: 317.9</td></tr>
 </table>
 ]]></description>
           <LookAt>
 <tr><td>Temperature: 19.8</td></tr>
 <tr><td>Depth: 818.2 ft</td></tr>
 <tr><td>Speed: 65.4 mph</td></tr>
-<tr><td>Heading: 25.6</td></tr>
+<tr><td>Heading: 34.9</td></tr>
 <tr><td>Time: 1970-01-01T00:00:09.290Z</td></tr>
 </table>
 ]]></description>
 <tr><td>Temperature: 23.9</td></tr>
 <tr><td>Depth: 2233.7 ft</td></tr>
 <tr><td>Speed: 125.4 mph</td></tr>
-<tr><td>Heading: 50.7</td></tr>
+<tr><td>Heading: 52.9</td></tr>
 <tr><td>Time: 1970-01-01T00:00:24.084Z</td></tr>
 </table>
 ]]></description>
 <tr><td>Cadence: 40</td></tr>
 <tr><td>Depth: 2066.8 ft</td></tr>
 <tr><td>Speed: 160.6 mph</td></tr>
-<tr><td>Heading: 38.0</td></tr>
+<tr><td>Heading: 45.1</td></tr>
 <tr><td>Time: 1970-01-01T00:00:31.102Z</td></tr>
 </table>
 ]]></description>
index 1223fbca9b91d66600e2aee20096bf4cc5945822..e9d290b7e5ef2083f66f63c6722180582299c7e8 100644 (file)
 <tr><td>Longitude: -117.422570</td></tr>
 <tr><td>Latitude: 36.339560</td></tr>
 <tr><td>Altitude: 1572.507 ft</td></tr>
-<tr><td>Heading: 309.7</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <tr><td>Longitude: -117.072030</td></tr>
 <tr><td>Latitude: 36.236600</td></tr>
 <tr><td>Altitude: 7455.052 ft</td></tr>
-<tr><td>Heading: 309.5</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -116.879080</td></tr>
 <tr><td>Latitude: 36.463670</td></tr>
-<tr><td>Heading: 309.6</td></tr>
 </table>
 ]]></description>
             <LookAt>
index 883ba1061e85940253507079b01cc7e4ff31189e..81236455da88830bbf97e1c622e072980048375d 100644 (file)
 <tr><td>Altitude: 0.449 ft</td></tr>
 <tr><td>Cadence: 151</td></tr>
 <tr><td>Heart rate: 111</td></tr>
-<tr><td>Heading: 360.0</td></tr>
 <tr><td>Time: 2008-08-20T07:04:48Z</td></tr>
 </table>
 ]]></description>
index 1e5a2745289f07146612b2188298a26a06720ae6..13b35c7aedfcc2fa2a0edb64028a7a127ebd026e 100644 (file)
 <table>
 <tr><td>Longitude: -86.844140</td></tr>
 <tr><td>Latitude: 35.826146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -86.844140</td></tr>
 <tr><td>Latitude: 35.826146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -86.844140</td></tr>
 <tr><td>Latitude: 35.836146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
 <tr><td>Time: 2007-07-27T05:24:05Z</td></tr>
 </table>
 ]]></description>
index e9bf89acd044c6913a6617485a74001dda3324bb..b61e664f4d54c3c114ebfba8752f5b41cae901d7 100644 (file)
@@ -97,7 +97,6 @@
 <table>
 <tr><td>Longitude: -86.844140</td></tr>
 <tr><td>Latitude: 35.826146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
 </table>
 ]]></description>
             <LookAt>
 <table>
 <tr><td>Longitude: -86.844140</td></tr>
 <tr><td>Latitude: 35.836146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
 <tr><td>Time: 2007-07-27T05:24:05Z</td></tr>
 </table>
 ]]></description>
index ef60c3c1319d175fe82d211641a68cb801c01ac7..d19ba712aeea773b8c887c384315d96b5a787850 100644 (file)
@@ -6,7 +6,6 @@
     <trkseg>
       <trkpt lat="0.000000000" lon="2.999550663">
         <time>2010-01-01T00:00:00Z</time>
-        <speed>0.000000</speed>
       </trkpt>
       <trkpt lat="0.000000000" lon="2.999649517">
         <time>2010-01-01T00:00:00.200Z</time>
index 107805b54b74bf4ac6f9395d10c9df59d470f82d..97af4c44f3c0507063cdd075b0e72d23324ce9ab 100644 (file)
@@ -6,7 +6,6 @@
     <trkseg>
       <trkpt lat="0.000000000" lon="2.999550663">
         <time>2010-01-01T00:00:00Z</time>
-        <speed>0.000000</speed>
       </trkpt>
       <trkpt lat="0.000000000" lon="2.999649517">
         <time>2010-01-01T00:00:00.200Z</time>
@@ -28,7 +27,6 @@
     <trkseg>
       <trkpt lat="0.000000000" lon="3.000134801">
         <time>2010-01-01T00:00:01Z</time>
-        <speed>0.000000</speed>
       </trkpt>
       <trkpt lat="0.000000000" lon="3.000278589">
         <time>2010-01-01T00:00:01.200Z</time>
index e620d0d2ff2f097d8042e095070feba765c224e8..b70900094d3b1ce3b0fd42711571ce00c01c8626 100644 (file)
 <tr><td>Longitude: -91.610350</td></tr>
 <tr><td>Latitude: 30.062183</td></tr>
 <tr><td>Altitude: 1.000 meters</td></tr>
-<tr><td>Heading: 300.1</td></tr>
 <tr><td>Time: 2002-05-25T17:06:21.250Z</td></tr>
 </table>
 ]]></description>
index 23474f02fa267e21bbffdc21890a26836d30b58d..a7cc10ca690c7f5bc48778637d70842a3c13cf6a 100644 (file)
@@ -1,5 +1,5 @@
 No,Latitude,Longitude,Speed,Date,Time\r
-1,0.000000,2.999551,0.00,2010/01/01,00:00:00\r
+1,0.000000,2.999551,,2010/01/01,00:00:00\r
 2,0.000000,2.999641,50.02,2010/01/01,00:00:00.200\r
 3,0.000000,2.999730,50.02,2010/01/01,00:00:00.400\r
 4,0.000000,2.999820,50.02,2010/01/01,00:00:00.600\r
index f7cd571d2517aa5ea9069eb39ef0aa734f9be3e9..95e6940aabbc4b9dac2eaa360820104702c82b8a 100644 (file)
--- a/route.cc
+++ b/route.cc
@@ -235,13 +235,11 @@ track_swap(RouteList& other)
  * Run over all the trackpoints, computing heading (course), speed, and
  * and so on.
  *
- * If trkdatap is non-null upon entry, a pointer to an allocated collection
- * (hopefully interesting) statistics about the track will be placed there.
+ * return a collection of (hopefully interesting) statistics about the track.
  */
 computed_trkdata track_recompute(const route_head* trk)
 {
-  Waypoint first;
-  const Waypoint* prev = &first;
+  const Waypoint* prev = nullptr;
   int tkpt = 0;
   int pts_hrt = 0;
   double tot_hrt = 0.0;
@@ -251,44 +249,41 @@ computed_trkdata track_recompute(const route_head* trk)
   double tot_pwr = 0.0;
   computed_trkdata tdata;
 
-//  first.latitude = 0;
-//  first.longitude = 0;
-//  first.creation_time = 0;
-
   foreach (Waypoint* thisw, trk->waypoint_list) {
 
-    /*
-     * gcdist and heading want radians, not degrees.
-     */
-    double tlat = RAD(thisw->latitude);
-    double tlon = RAD(thisw->longitude);
-    double plat = RAD(prev->latitude);
-    double plon = RAD(prev->longitude);
-    thisw->set_course(heading_true_degrees(plat, plon, tlat, tlon));
-    double dist = radtometers(gcdist(plat, plon, tlat, tlon));
-
-    /*
-     * Avoid that 6300 mile jump as we move from 0,0.
-     */
-    if (plat && plon) {
+    if (prev != nullptr) {
+      /*
+       * gcdist and heading want radians, not degrees.
+       */
+      double tlat = RAD(thisw->latitude);
+      double tlon = RAD(thisw->longitude);
+      double plat = RAD(prev->latitude);
+      double plon = RAD(prev->longitude);
+      if (!thisw->course_has_value()) {
+        // Only recompute course if the waypoint
+        // didn't already have a course.
+        thisw->set_course(heading_true_degrees(plat, plon, tlat, tlon));
+      }
+      double dist = radtometers(gcdist(plat, plon, tlat, tlon));
       tdata.distance_meters += dist;
-    }
 
-    /*
-     * If we've moved as much as a meter,
-     * conditionally recompute speeds.
-     */
-    if (!thisw->speed_has_value() && (dist > 1)) {
-      // Only recompute speed if the waypoint
-      // didn't already have a speed
-      if (thisw->GetCreationTime().isValid() &&
-          prev->GetCreationTime().isValid() &&
-          thisw->GetCreationTime() > prev->GetCreationTime()) {
-        double timed =
-          prev->GetCreationTime().msecsTo(thisw->GetCreationTime()) / 1000.0;
-        thisw->set_speed(dist / timed);
+      /*
+       * If we've moved as much as a meter,
+       * conditionally recompute speeds.
+       */
+      if (!thisw->speed_has_value() && (dist > 1)) {
+        // Only recompute speed if the waypoint
+        // didn't already have a speed
+        if (thisw->GetCreationTime().isValid() &&
+            prev->GetCreationTime().isValid() &&
+            thisw->GetCreationTime() > prev->GetCreationTime()) {
+          double timed =
+            prev->GetCreationTime().msecsTo(thisw->GetCreationTime()) / 1000.0;
+          thisw->set_speed(dist / timed);
+        }
       }
     }
+
     if (thisw->speed_has_value()) {
       if ((!tdata.min_spd) || (thisw->speed_value() < tdata.min_spd)) {
         tdata.min_spd = thisw->speed_value();
index b1cd3119ed5eeac802a95207ae9255c9cfef7258..f63b1359c7333d6c18d48bd553a89a97a8fc4c82 100644 (file)
@@ -618,12 +618,10 @@ void TrackFilter::trackfilter_synth()
       }
       if (first) {
         if (opt_course) {
-          // TODO: the course value 0 isn't valid, wouldn't it be better to UNSET course?
-          wpt->set_course(0);
+          wpt->reset_course();
         }
         if (opt_speed) {
-          // TODO: the speed value 0 isn't valid, wouldn't it be better to UNSET speed?
-          wpt->set_speed(0);
+          wpt->reset_speed();
         }
         first = false;
         last_course_lat = wpt->latitude;